package com.yeyks.commonReference.service.hotel;

import com.baomidou.mybatisplus.extension.service.IService;
import com.github.pagehelper.PageInfo;
import com.yeyks.account.dal.domain.AccountInfo;
import com.yeyks.common.ajax.AjaxResponseBody;
import com.yeyks.common.appcommon.dto.AppStarLevelDTO;
import com.yeyks.common.appcommon.dto.finance.PayAmountFinanceDTO;
import com.yeyks.common.appcommon.dto.hotel.AppHotelBasicDTO;
import com.yeyks.common.appcommon.dto.hotel.AppHotelDetailDTO;
import com.yeyks.common.appcommon.dto.hotel.AppHotelInfoDTO;
import com.yeyks.common.appcommon.dto.hotel.AppHotelTypeDTO;
import com.yeyks.common.appcommon.dto.room.AppRoomNoteDTO;
import com.yeyks.common.appcommon.param.finance.GetIncomeAccountParam;
import com.yeyks.common.appcommon.param.hotel.*;
import com.yeyks.common.appcommon.param.room.SetRoomNoteParam;
import com.yeyks.common.appcommon.result.CommonPage;
import com.yeyks.common.appcommon.result.CommonResult;
import com.yeyks.common.dto.NewPayAmountDTO;
import com.yeyks.common.param.WithdrawalUpdateCardParam;
import com.yeyks.common.param.finance.FinanceBindParam;
import com.yeyks.common.result.screen.DataGreenVipHotelMonthResult;
import com.yeyks.common.result.screen.DataScreenHotelStarResult;
import com.yeyks.hotel.dal.domain.HotelInfo;
import com.yeyks.hotel.dto.HotelCreateParam;
import com.yeyks.hotel.dto.HotelInfoC2bHotelVipSearchDto;
import com.yeyks.hotel.dto.HotelInfoDTO;
import com.yeyks.hotel.dto.HotelInfoV2DTO;
import com.yeyks.hotel.param.*;
import com.yeyks.hotel.vo.*;
import org.springframework.validation.annotation.Validated;

import java.util.Date;
import java.util.List;
import java.util.Map;


/**
 * <p>
 * 酒店信息表 服务类
 * </p>
 *
 * @author yun
 * @since 2019-06-25
 */
public interface HotelInfoService extends IService<HotelInfo> {

    /**
     * 新增酒店(同时需要先增加公司信息，再增加用户，后增加酒店)
     *
     * @param createParam
     * @param loginUser
     * @return
     */
    Integer createHotel(HotelCreateParam createParam, AccountInfo loginUser);

    /**
     * 通过酒店id搜索酒店
     *
     * @param hotelId
     * @return
     */
    HotelInfo selectHotelInfoById(Integer hotelId);


    HotelInfo selectHotelInfoByOperatorId(Integer operatorId);
    /**
     * 根据账号类型查询新增酒店数量
     *
     * @param dtStart
     * @param dtEnd
     * @param type
     * @return
     */
    int getNewHotelCount(Date dtStart, Date dtEnd, Integer id, Integer type);

    AjaxResponseBody upgradeVipHotel(Integer hotelId, Integer developerId,Integer vipFlag);

    AjaxResponseBody upgradeJipHotel(Integer hotelId, Integer developerId);

    AjaxResponseBody modifyRemark(Integer hotelId, String remark);

    AjaxResponseBody modifyParentTax(Integer hotelId, Integer parentTax);

    AjaxResponseBody submitHotel(Integer hotelId);

    AjaxResponseBody setHotelDeveloper(Integer hotelId, Integer developerId);

    AjaxResponseBody setHotelAgent(Integer hotelId, Integer agentId);

    List<Map> queryHotelList(HotelQueryParam hotelQueryParam);

    int queryHotelListCount(HotelQueryParam hotelQueryParam);

    List<Map> queryHotelListByDeveloper(HotelQueryParam hotelQueryParam);

    int queryHotelListCountByDeveloper(HotelQueryParam hotelQueryParam);
    /**
     * 查询免用期到期酒店
     *
     * @param id
     * @return
     */
    List<HotelInfo> searchHotelsNoTaxExpired(Integer id);

    /**
     * @param id
     * @return
     */
    List<HotelInfo> searchHotelsByAdministrator(Integer id);


    /**
     * 酒店管理员ID到酒店信息
     *
     * @param id
     * @return
     */
    List<HotelInfo> searchHotelsByOperator(Integer id);


    /**
     * 酒店管理员ID到酒店信息
     *
     * @param id
     * @return
     */
    HotelInfo searchHotelByOperator(Integer id);

    /**
     * 判断一个酒店是否是该操作员的管辖，并返回酒店信息
     *
     * @param loginUserId
     * @param hotelId
     * @return
     */
    HotelInfo searchHotelByOperator(Integer loginUserId, Integer hotelId);

    /**
     * 停用启用酒店，同时启用停用酒店账号
     *
     * @param hotelId
     * @param status
     * @return
     */
    int updateValidByIds(Integer hotelId, Boolean status);

    /**
     * 设置酒店免佣期
     *
     * @param hotelId
     * @param startDateNotax
     * @param endDateNoTax
     * @return
     */
    int updateNoFeeDate(Integer hotelId, Date startDateNotax, Date endDateNoTax);

    /**
     * 第一单订单完成时设置酒店免用期
     *
     * @param hotelId
     * @param createTime 创建时间
     * @return
     */
    int setNoFeeDateAtFirstOrder(Integer hotelId, Date createTime);

    /**
     * 用户搜索酒店（2民宿，3三星级，4四星级，5五星级，6商务）
     *
     * @param city      城市名称，例：北京
     * @param checkIn   check-in日期，字符串描述，没有时间部分，例：2018-08-13
     * @param checkOut  check-out日期，字符串描述，没有时间部分，例：2018-08-16
     * @param price     价格（单位：分），默认值（0不限价），例：20000 （200元）
     * @param starLevel 星级：默认全部0，2民宿，3星级，6商务
     * @param keyword   关键字按照酒店名称或者房型
     * @param order     推荐(排序)模式：order 0智能排序（默认是这个），1距离（按照距离升序），2价格（按照价格升序），3价格（按照价格降序）
     * @param pageNum   当前页
     * @param pageSize  页码
     * @param positionX 经度
     * @param positionY 纬度
     * @return
     */
    @Deprecated
    Map<String, Object> searchHotel(String city, Long checkIn, Long checkOut, Integer price, Integer starLevel, String keyword, Integer order, Integer pageNum, Integer pageSize, Double positionX, Double positionY);

    /**
     * 通过酒店id计算酒店的平均分
     *
     * @param hotelId
     * @return
     */
    Integer updateScore(Integer hotelId);

    /**
     * 通过酒店的id查询酒店的详情
     *
     * @param hotelId
     * @return
     */
    HotelInfoDTO selectHotelRoomDetail(Integer hotelId);

    /**
     * 通过酒店的id查询酒店的详情(V2)
     *
     * @param hotelId
     * @return
     */
    HotelInfoV2DTO selectHotelRoomDetailV2(Integer hotelId);

    /**
     * 通过酒店信息获取酒店联系人的手机号（用于发短信）
     *
     * @param hotelInfo
     * @return
     */
    String getSmsPhoneByHotelInfo(HotelInfo hotelInfo);

    /**
     * 通过酒店信息获取酒店固话，没有使用手机号
     *
     * @param hotelInfo
     * @return
     */
    String getTelByHotelInfo(HotelInfo hotelInfo);

    /**
     * 用户搜索酒店(按照星级搜索)（2民宿，3三星级，4四星级，5五星级，6商务）
     *
     * @param city      城市名称，例：北京
     * @param checkIn   check-in日期，字符串描述，没有时间部分，例：2018-08-13
     * @param checkOut  check-out日期，字符串描述，没有时间部分，例：2018-08-16
     * @param price     价格（单位：分），默认值（0不限价），例：20000 （200元）
     * @param starLevel 星级：默认全部0，2民宿，3星级，6商务
     * @param positionX 经度
     * @param positionY 纬度
     * @return
     */
    @Deprecated
    Map<String, Object> searchHotelNew(String city, Long checkIn, Long checkOut, Integer price, Integer starLevel, Double positionX, Double positionY);

    /**
     * 用户搜索酒店(按照舒适度搜索)（0查询全部，1舒适 2高档 3豪华 4民宿专区）
     *
     * @param city      城市名称，例：北京
     * @param checkIn   check-in日期，字符串描述，没有时间部分，例：2018-08-13
     * @param checkOut  check-out日期，字符串描述，没有时间部分，例：2018-08-16
     * @param price     价格（单位：分），默认值（0不限价），例：20000 （200元）
     * @param starLevel 星级：默认1舒适 2高档 3豪华 4民宿专区
     * @param positionX 经度
     * @param positionY 纬度
     * @return
     */
    @Deprecated
    Map<String, Object> searchHotelV2(String city, Long checkIn, Long checkOut, Integer price, Integer starLevel, Double positionX, Double positionY);

    /**
     * 臻选酒店搜索
     *
     * @param param
     * @return
     */
    @Deprecated
    Map<String, Object> vipHotelSearch(VipSearchParam param);

    /**
     * 通过酒店id获取酒店集合
     *
     * @param hotelIds
     * @return
     */
    List<HotelInfo> selectByIds(List<Integer> hotelIds);

    /**
     * C2B酒店搜索:v3.3
     *
     * @param param
     * @return
     */
    HotelInfoC2bHotelSearchVo c2bHotelSearch(HotelInfoC2bHotelSearchParam param);

    /**
     * 酒店详情:v3.3
     *
     * @param param
     * @return
     */
    HotelInfoHotelSearchHotelInfoVo hotelSearchHotelInfo(HotelInfoHotelSearchHotelInfoParam param);

    /**
     * 根据登录账户获取该账户下的酒店
     *
     * @param accountInfo
     * @return 返回酒店集合
     */
    List<HotelInfo> getHotelInfoByAccountId(AccountInfo accountInfo);

    /**
     * 根据登录账户获取该账户下的酒店
     *
     * @param accountInfo
     * @return 返回酒店Id集合
     */
    List<Integer> getHotelInfoByAccountIdToId(AccountInfo accountInfo);

    /**
     * 查询该酒店账户的酒店，没有酒店抛异常
     *
     * @param accountInfo
     * @return
     */
    HotelInfo getHotelInfoAccountHotelInfo(AccountInfo accountInfo);

    /**
     * 获取酒店的收支信息
     *
     * @param getIncomeAccountParam 输入参数
     * @param convert               操作人
     * @return 返回结果
     */
    CommonResult<PayAmountFinanceDTO> getIncomeAccount(GetIncomeAccountParam getIncomeAccountParam, AccountInfo convert);

//    /**
//     * 修改绑定银行卡账户
//     *
//     * @param loginUser
//     * @param param
//     * @param updateType 0修改总公司，1修改酒店
//     * @return
//     */
//    boolean updateBind(AccountInfo loginUser, WithdrawalUpdateCardParam param, Integer updateType);


    /**
     * admin - app 分页查询酒店列表信息
     *
     * @param queryHotelParam 查询参数
     * @param convert         操作人
     * @return 返回分页信息
     */
    CommonResult<CommonPage<AppHotelBasicDTO>> listPage(QueryHotelParam queryHotelParam, AccountInfo convert);

    /**
     * admin - app 分页查询该账号下的子酒店
     *
     * @param queryHotelByAccountIdParam 查询参数
     * @param convert                    操作人
     * @return 返回结果
     */
    CommonResult<CommonPage<AppHotelBasicDTO>> queryListByAccountId(QueryHotelByAccountIdParam queryHotelByAccountIdParam, AccountInfo convert);

    /**
     * admin - app 查询酒店详情数据
     *
     * @param getHotelDetailParam 查询酒店详情参数
     * @param convert             操作人
     * @return 返回酒店详情
     */
    CommonResult<AppHotelDetailDTO> getHotelDetail(GetHotelDetailParam getHotelDetailParam, AccountInfo convert);

    /**
     * admin - app 更新酒店基本信息
     *
     * @param hotelInfoParam 更新输入参数
     * @param convert        操作人
     * @return 返回更新结果
     */
    CommonResult updateHotel(UpdateHotelInfoParam hotelInfoParam, AccountInfo convert);

    /**
     * admin - app 禁用启用酒店信息
     *
     * @param updateValidHotelParam 操作禁用启用参数
     * @param convert               操作人
     * @param valid true启用， false 禁用， null 取反
     * @return 返回结果
     */
    CommonResult validHotel(UpdateValidHotelParam updateValidHotelParam, AccountInfo convert, Boolean valid);

    /**
     * admin - app 得到酒店类型
     *
     * @param convert 操作人
     * @return 返回结果
     */
    CommonResult<List<AppHotelTypeDTO>> getHotelType(AccountInfo convert);

    /**
     * admin - app 得到酒店星级
     *
     * @param convert 操作人
     * @return 返回结果
     */
    CommonResult<List<AppStarLevelDTO>> getStarLevel(AccountInfo convert);

    /**
     * admin - app更新酒店入住须知
     *
     * @param setRoomNoteParam 设置参数
     * @param convert          操作人
     * @return 返回结果
     */
    CommonResult updateRoomNote(SetRoomNoteParam setRoomNoteParam, AccountInfo convert);

    /**
     * admin - app 获取酒店入住须知信息
     *
     * @param convert 操作人
     * @return 返回结果
     */
    CommonResult<AppRoomNoteDTO> getRoomNote(AccountInfo convert);

    /**
     * 酒店设置是否手动抢单
     *
     * @param loginUser 当前登录用户
     * @param isRob     0自动抢单，1手动抢单
     */
    void isRob(AccountInfo loginUser, Integer isRob);

    /**
     * 查看酒店抢单状态
     *
     * @param loginUser 当前登录用户
     * @return
     */
    Integer robStatus(AccountInfo loginUser);

    /**
     * 通过酒店id查询酒店账户id
     *
     * @param hotelId
     * @return
     */
    Integer selectOperatorIdByHotelId(Integer hotelId);

    /**
     * 判断酒店是否在免佣期
     *
     * @param gmtCreate
     * @param hotelId
     * @return
     */
    boolean isInNoFeeDate(Date gmtCreate, Integer hotelId);

    /**
     * 全国酒店星级
     *
     * @return
     */
    List<DataScreenHotelStarResult> statStar();

    /**
     * 酒店数量统计
     * @return 返回结果
     */
    List<DataGreenVipHotelMonthResult> statVipHotelSixMonth();
}
